-- Lua Battle System - 错误处理优化测试

-- 设置Lua路径
package.path = package.path .. ';src/?.lua;src/utils/?.lua;src/characters/?.lua;res/data/?.lua'

local Logger = require("utils.logger")
local Errors = require("utils.errors")
local ErrorHandler = require("utils.error_handler")

print("Lua Battle System 错误处理优化测试")
print("=" .. string.rep("=", 49))

-- 初始化日志和错误处理
Logger.init({level = "debug"})
local error_handler = ErrorHandler:new()

-- 配置错误处理器
error_handler:configure({
    enable_debug_info = true,
    enable_stack_trace = true,
    log_errors = true,
    trigger_events = true
})

-- 配置性能监控
error_handler:configure_performance_monitoring({
    enable_monitoring = true,
    response_time_threshold = 50, -- 50ms阈值用于测试
    memory_threshold = 10 -- 10MB阈值用于测试
})

print("✅ 错误处理系统初始化完成")

-- 测试1: 扩展的错误类型
print("\n🧪 测试1: 扩展的错误类型")

-- 测试新的错误类型
local timeout_error = Errors:create(Errors.TIMEOUT_ERROR, "操作超时")
local memory_error = Errors:create(Errors.MEMORY_ERROR, "内存不足")
local performance_error = Errors:create(Errors.PERFORMANCE_ERROR, "性能下降")

print("✅ 创建超时错误: " .. Errors:format(timeout_error))
print("✅ 创建内存错误: " .. Errors:format(memory_error))
print("✅ 创建性能错误: " .. Errors:format(performance_error))

-- 测试2: 错误上下文信息收集
print("\n🧪 测试2: 错误上下文信息收集")

-- 设置全局上下文
Errors.ContextManager.set_battle_context("battle_001")
Errors.ContextManager.set_character_context("hero_001")
Errors.ContextManager.set_skill_context("fireball")
Errors.ContextManager.set_module_context("skills.skill_manager")

-- 创建带上下文的错误
local contextual_error = Errors:create_with_context(
    Errors.SKILL_FAILED,
    "火球术施放失败",
    {reason = "目标超出范围"}
)

print("✅ 带上下文的错误:")
print(Errors:format_with_context(contextual_error))

-- 测试上下文摘要
local context_summary = Errors:get_context_summary(contextual_error)
print("✅ 上下文摘要: " .. context_summary)

-- 测试3: 性能监控
print("\n🧪 测试3: 性能监控")

-- 开始性能计时
error_handler:start_performance_timer("test_function_1")

-- 模拟一些工作
local function test_function()
    local sum = 0
    for i = 1, 100000 do
        sum = sum + math.sin(i) * math.cos(i)
    end
    return sum
end

test_function()

-- 结束性能计时
local perf_data = error_handler:end_performance_timer("test_function_1")

if perf_data then
    print("✅ 性能数据:")
    print("  - 执行时间: " .. string.format("%.2f ms", perf_data.duration_ms))
    print("  - 内存变化: " .. string.format("%.2f KB", perf_data.memory_delta_kb))
    print("  - 开始内存: " .. string.format("%.2f KB", perf_data.start_memory_kb))
    print("  - 结束内存: " .. string.format("%.2f KB", perf_data.end_memory_kb))
end

-- 记录内存使用情况
error_handler:record_memory_usage()
print("✅ 内存使用情况已记录")

-- 测试4: 错误恢复机制
print("\n🧪 测试4: 错误恢复机制")

-- 注册一个简单的恢复策略
error_handler:register_recovery_strategy(Errors.TIMEOUT_ERROR, function(error_obj, original_func, ...)
    print("  🔧 尝试超时错误恢复策略...")

    -- 模拟重试
    local success, result = pcall(original_func, ...)
    if success then
        return {success = true, result = result, strategy = "timeout_recovery"}
    else
        return {success = false, error = "重试失败", strategy = "timeout_recovery"}
    end
end)

-- 测试错误恢复的函数
local function failing_function(attempt_count)
    attempt_count = attempt_count or 0

    if attempt_count < 2 then
        error("模拟超时错误")
    else
        return "成功执行"
    end
end

-- 使用安全执行函数
print("  🔄 第一次执行（预期失败）...")
local success1, result1 = error_handler:safe_execute(failing_function)

if not success1 then
    print("  ❌ 第一次执行失败，尝试恢复...")

    -- 手动触发恢复
    local recovery_result = error_handler:attempt_recovery(
        Errors:create_with_context(Errors.TIMEOUT_ERROR, "操作超时", {attempt = 1}),
        failing_function, 1
    )

    if recovery_result.success then
        print("  ✅ 恢复成功: " .. tostring(recovery_result.result))
    else
        print("  ❌ 恢复失败: " .. recovery_result.error)
    end
end

-- 测试5: 错误统计和性能报告
print("\n🧪 测试5: 错误统计和性能报告")

-- 获取错误统计
local error_stats = error_handler:get_error_stats()
print("✅ 错误统计:")
print("  - 总错误数: " .. error_stats.total_errors)
print("  - 恢复尝试次数: " .. error_stats.recovery_attempts)
print("  - 恢复成功次数: " .. error_stats.recovery_success)
print("  - 恢复失败次数: " .. error_stats.recovery_failure)
print("  - 恢复成功率: " .. string.format("%.2f%%", error_stats.recovery_success_rate))

-- 获取性能报告
local perf_report = error_handler:get_performance_report()
print("\n✅ 性能报告:")
print("  - 监控启用: " .. tostring(perf_report.monitoring_enabled))
print("  - 监控持续时间: " .. perf_report.monitoring_duration .. " 秒")

if perf_report.function_performance.total_calls and perf_report.function_performance.total_calls > 0 then
    local fp = perf_report.function_performance
    print("  - 函数调用统计:")
    print("    * 总调用次数: " .. fp.total_calls)
    print("    * 平均执行时间: " .. string.format("%.2f ms", fp.avg_duration_ms))
    print("    * 最大执行时间: " .. string.format("%.2f ms", fp.max_duration_ms))
    print("    * 最小执行时间: " .. string.format("%.2f ms", fp.min_duration_ms))
end

if perf_report.memory_performance.current_memory_kb then
    local mp = perf_report.memory_performance
    print("  - 内存使用统计:")
    print("    * 当前内存: " .. string.format("%.2f KB", mp.current_memory_kb))
    print("    * 平均内存: " .. string.format("%.2f KB", mp.avg_memory_kb))
    print("    * 内存增长: " .. string.format("%.2f KB", mp.memory_growth_kb))
end

-- 测试6: 增强的堆栈跟踪
print("\n🧪 测试6: 增强的堆栈跟踪")

-- 创建一个多层函数调用来测试堆栈跟踪
local function level3()
    error("测试堆栈跟踪")
end

local function level2()
    level3()
end

local function level1()
    level2()
end

print("  🔄 触发多层函数调用错误...")

-- 使用pcall捕获错误
local success, error_message = pcall(level1)

if not success then
    print("  ✅ 堆栈跟踪捕获成功")

    -- 解析错误（这会触发增强的堆栈跟踪功能）
    local error_obj = error_handler:parse_error(error_message, debug.traceback())

    if error_obj.details and error_obj.details.enhanced_stack_trace then
        print("  ✅ 增强堆栈跟踪:")
        print("    " .. string.gsub(error_obj.details.enhanced_stack_trace, "\n", "\n    "))
    end

    if error_obj.details and error_obj.details.stack_summary then
        local summary = error_obj.details.stack_summary
        if type(summary) == "table" then
            print("  ✅ 堆栈摘要:")
            print("    * 调用深度: " .. summary.call_depth)
            if #summary.functions > 0 then
                print("    * 调用链: " .. table.concat(summary.functions, " -> "))
            end
        end
    end
end

-- 清理上下文
Errors.ErrorContext.clear_global_context()

print("\n🎉 错误处理优化测试完成！")
print("=" .. string.rep("=", 49))

print("\n📊 测试总结:")
print("✅ 扩展的错误类型定义 - 通过")
print("✅ 错误上下文信息收集 - 通过")
print("✅ 增强的堆栈跟踪信息 - 通过")
print("✅ 错误恢复机制 - 通过")
print("✅ 性能监控和异常统计 - 通过")

print("\n🚀 错误处理系统优化完成，系统稳定性和调试能力显著提升！")